package py.fpuna.ii.electiva2.client.clases;

import py.fpuna.ii.electiva2.client.model.VentaModel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import py.fpuna.ii.electiva2.client.GWTServiceVent;
import py.fpuna.ii.electiva2.client.GWTServiceVentAsync;
import py.fpuna.ii.electiva2.client.model.ClienteModel;
import py.fpuna.ii.electiva2.client.model.ProductoModel;


/**
 *
 * @author gonzaleza
 */
public class ABMVentas extends VerticalPanel{

    ABMVentas miABM;
    FlexTable datos = new FlexTable();    
    FlexTable tablaVent = new FlexTable();

    TextBox textCantidad = new TextBox();
    ListBox listCliente = new ListBox();
    ListBox listProducto = new ListBox();


    Button guardar = new Button("Agregar");
    private Label resultado = new Label();

    List <Integer> listCodeCliente = new ArrayList<Integer>();

    VentaModel ventafinal = new VentaModel();

    ProductoModel prodM = new ProductoModel();
    

    public ABMVentas()   {
        
        datos.setText(0, 0, "Cantidad");
        datos.setText(1, 0, "Cliente");
        datos.setText(1, 2, "Producto");

        datos.setWidget(0,1, this.textCantidad);
        datos.setWidget(1,1, this.listCliente);
        datos.setWidget(1,3, this.listProducto);

        miABM = this;   //me referencio a mi mismo
        miABM.add(datos);
        miABM.add(guardar);
        Window.setTitle("TAREA GWT - EJB");

        cargarListaCliente();
        cargarListaProductos();

        miABM.add(resultado);
        mostrarTabla(); //reconstruye la tabla

        guardar.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                agregarVenta();
            }
        });
    }

    public static GWTServiceVentAsync getService() {
        // Create the client proxy. Note that although you are creating the
        // service interface proper, you cast the result to the asynchronous
        // version of the interface. The cast is always safe because the
        // generated proxy implements the asynchronous interface automatically.

        return GWT.create(GWTServiceVent.class);
    }


    private void agregarVenta()
    {
        String can = this.textCantidad.getText();
        Integer codproducto = 0;
        Integer codCliente = 0;


        int icliente= listCliente.getSelectedIndex();
        int iprod= listProducto.getSelectedIndex();

        if ((icliente > 0) && (iprod > 0))
        {
            codCliente= Integer.parseInt(listCliente.getValue(icliente));
            codproducto = Integer.parseInt(listProducto.getValue(iprod));
        }

        if ( can.compareTo("") == 0 ||
             codCliente < 0 ||
             codproducto < 0 )
        {
            Window.setTitle("TAREA GWT - EJB");
            Window.alert("Debe cargar todos los campos");
            textCantidad.setFocus(true);
            return;
        }

        ventafinal.setVentCantidad(Integer.parseInt(can));
        

        // Create an asynchronous callback to handle the result.
        final AsyncCallback<String> callback3 = new AsyncCallback<String>() {
            public void onSuccess(String result) {
                if (result.equalsIgnoreCase("true")){
                    Window.alert("Registro guardado satisfactoriamente");
                    mostrarTabla();
                }else{
                    Window.alert("Error. La venta no se puede efectuar");

                }
            }
            public void onFailure(Throwable caught) {
                Window.alert("Error. Ingrese palabras mas cortas en los campos");
            }
        };

       getService().guardarVenta(ventafinal,codproducto,codCliente, callback3);

       codproducto = 0;
    }

    private void mostrarTabla(){
        miABM.remove(tablaVent);
        tablaVent = new FlexTable();


        final AsyncCallback< List<VentaModel> > callback2 = new AsyncCallback< List<VentaModel> >() {
            public void onSuccess(List<VentaModel> result) {
                tablaVent.setWidth("800px");
                tablaVent.setBorderWidth(1);

                tablaVent.setText(0, 0, "Cantidad");
                tablaVent.setText(0, 1, "Cliente");
                tablaVent.setText(0, 2, "Producto");

                if (result == null){
                    resultado.setText("No hay datos en la tabla");
                }else{  //recibi datos en result

                    Iterator <VentaModel> ventIt = result.iterator();
                    int f = 1;

                    while(ventIt.hasNext()){

                        VentaModel ventM = ventIt.next();

                        tablaVent.setWidget(f, 0, new Label(ventM.getVentCantidad().toString()));
                        tablaVent.setWidget(f, 1, new Label(ventM.getVentCliente().getClieNombre()));
                        tablaVent.setWidget(f, 2, new Label(ventM.getVentProducto().getProdDescripcion()));

                        f++;
                    }
                }

                miABM.add(tablaVent); //cargo la tabla en mi mismo
            }

            public void onFailure(Throwable caught) {
                resultado.setText("Fallo la comunicacion");
            }
        };

        getService().listarVenta(callback2);
    }

    private void cargarListaCliente(){
        final AsyncCallback< List<ClienteModel> > callback =new AsyncCallback< List<ClienteModel> >() {

             public void onSuccess(List<ClienteModel> result) {

                 Iterator<ClienteModel> itCliente = result.iterator();

                 listCliente.addItem("<<seleccione un cliente>>","0");
                 while (itCliente.hasNext()){
                     ClienteModel clientem = itCliente.next();
                     listCliente.addItem(clientem.getClieNombre(), clientem.getClieCodigo().toString());
                 }

            }

            public void onFailure(Throwable caught) {
                resultado.setText("Falló la comunicación");
            }

        };

        getService().listarClientes(callback);
    }

    private void cargarListaProductos() {

         final AsyncCallback< List<ProductoModel> > callback1 =new AsyncCallback< List<ProductoModel> >() {

             public void onSuccess(List<ProductoModel> result) {
                 listProducto.clear();
                 if (result.isEmpty()){
                    Window.alert("Este proveedor no tiene productos :(");
                 }else{
                     Iterator<ProductoModel> itProd = result.iterator();
                     listProducto.addItem("<<seleccione un producto>>", "0");
                     while (itProd.hasNext()){
                         ProductoModel prodm = itProd.next();
                         listProducto.addItem(prodm.getProdDescripcion(), prodm.getProdCodigo().toString());
                     }

                 }
            }

            public void onFailure(Throwable caught) {
                resultado.setText("Falló la comunicación");
            }

        };

        getService().listarProductos(callback1);


    }

}
